#include <stdlib.h>

#ifndef LIST_H
#define LIST_H

struct _node {
	void *element;
	struct _node *next;
};
typedef struct _node *node_p;

typedef struct {
	node_p head;
	node_p cur;
	node_p prev;
} list_t;
typedef list_t *list_p;

list_p list_new();
node_p node_new(void *element);

void list_free(list_p list);
void *node_free(node_p node);

void node_set(node_p node, void *element);
void *node_get(node_p node);

void *list_get(list_p list);
list_p list_add(list_p list, void *element);
node_p list_remove(list_p list);

void list_to_first(list_p list);
void *list_advance(list_p list);

int list_at_first(list_p);
int list_at_end(list_p list);
int list_is_empty(list_p list);
int list_cur_is_empty(list_p list);

int list_size(list_p list);

void node_reference_error();

#endif /* LIST_H */
